#include "ai.h"

AI::AI()
{
	msgbox.setText("В функции addNode() колличество созданных эелементов слов, не равно колличеству эллементов узлов");
	inside = out;
	memory.push_back("");
	number_and_combination.resize(1);
	inyan = 0;
}
int AI::receive(QString data)
{
	QVector <quint32>::size_type prev_w = 0;
	if (!data.isEmpty())
	{
		brokenLine(data);
		for (int current_number_of_words = 0; current_number_of_words < cache.size(); ++current_number_of_words)
		{
			// Найти слово в памяти и передать номер
			prev_w = addCombination(findNode(cache[current_number_of_words]), prev_w);
		}
	} else
	{
		msgbox.setText("Строка пуста");
		msgbox.exec();
	}
	return inyan;
}
QVector <quint32>::size_type AI::addCombination(QVector <quint32>::size_type select_word, QVector <quint32>::size_type previous)
{
	QVector <quint32>::size_type number_mass = number_and_combination[select_word][0];
	QVector <quint32>::size_type count_combin = number_and_combination[select_word][1];
	if (number_mass != select_word)
	{
		msgbox.setText("В функции addCombination select_word() не равен вычесленному number_mass");
		msgbox.exec();
	}
	number_and_combination[select_word].push_back(0);		// сюда будут присваиваться значения инь-ян
	number_and_combination[select_word].push_back(previous);
	number_and_combination[select_word].push_back(0);
	if (previous != 0)
	{
		number_and_combination[previous][number_and_combination[previous].size()-1] = select_word;
	}
	if (count_combin*LENGTH_NODE+2 != number_and_combination[select_word].size())
	{
		msgbox.setText("В функции addCombination count_combin не равен number_and_combination.size()");
		msgbox.exec();
	}
	return select_word;
}

QVector <quint32>::size_type AI::findNode(QString word)
{
	QVector<QString>::size_type sinkerNode;		// Проходчик по узлам в памяти
	for (sinkerNode = 0; sinkerNode != memory.size(); ++sinkerNode)
	{
		if (memory[sinkerNode] == word)
		{
			number_and_combination[sinkerNode][1] += 1;
			return sinkerNode;
		}
	}
	// Если слово не найдено, значит добавляем его в память
	if (sinkerNode != memory.size())
	{
		msgbox.setText("В функции findNode() sinkerNode не равно memory.size()");
		return addNode(word);
	} else
	{
		return addNode(word);
	}
}
QVector <quint32>::size_type AI::addNode(QString word)
{
	QVector<quint32> column;
	memory.push_back(word);
	column.push_back(memory.size()-1);
	column.push_back(1);				// Колличество узлов в первый раз равно еденице
	number_and_combination.push_back(column);
	if (number_and_combination.size() != memory.size())
	{
		msgbox.exec();
		return 0;
	}
	return number_and_combination.size()-1;
}
QString AI::getvecstr()
{
	temp.clear();
	for (QVector<QString>::iterator istart = memory.begin(); istart != memory.end(); ++ istart)
		temp.push_back(*istart+' ');
	return temp;
}
	// Написать код алгоритма разделения строки на слова, занести строку во временный буффер и пронумеровать всё
void AI::brokenLine(QString line)
{
	cache.clear();
	inside = out;
	int current_symbol;					// Номер символа в строке
	for (current_symbol = 0; current_symbol < line.size(); ++current_symbol)
	{
		if ((line[current_symbol] == ' ') || (line[current_symbol] == ','))
			inside = out;
		else
		{
			if (inside == out)
			{
				cache.resize(cache.size()+1);
				inside = in;
			}
			cache[cache.size()-1].push_back(line[current_symbol]);
		}
	}
}
QString AI::getCountNode()
{
	temp.clear();
	temp.setNum(number_and_combination.size()-1);
	return temp;
}
QString AI::getCombination()
{
	temp.clear();
	iivector::size_type i;
	QString s;
	s.clear();
	for (i = 1; i < number_and_combination.size(); ++i)
	{
		temp.push_back(memory[i]);
		temp.push_back('\t');
		s.setNum(number_and_combination[i][0]);
		temp.push_back(s+'\t');
		s.clear();
		s.setNum(number_and_combination[i][1]);	// Количество узлов
		temp.push_back(s+'\n');
	}
	return temp;
}
